#ifndef __INIEXTIO_HH_
#define __INIEXTIO_HH_

#include "zuc/nml_intf/zucpos.h"  //FIXME:剥离extio的数据结构
#include <string>

struct zucmot_command_t;

#define EXTIO_COMMU_UNKNOWN -1
#define EXTIO_COMMU_MBRTU 0
#define EXTIO_COMMU_MBTCP 1
#define EXTIO_CONFIG_VERSION 3
#define EXTIO_COMMU_DEFAULT_IP "0.0.0.0"
#define EXTIO_COMMU_DEFAULT_PORT 6501
#define EXTIO_COMMU_PORT_MAX 65500
#define EXTIO_COMMU_SLAVEID_MAX 255
#define EXTIO_COMMU_DEFAULT_BAUDRATE 4800
#define EXTIO_COMMU_DEFAULT_BITS 8
#define EXTIO_COMMU_DEFAULT_STOPBITS 1
#define EXTIO_COMMU_DEFAULT_PARITY 69
#define EXTIO_COMMU_MAX_RECONNECTINTERVAL 3000
#define EXTIO_COMMU_MAX_RECONNECTTIME 10

namespace Util {
class ConfigParser;
}

class ExtioConfig
{
public:
    ExtioConfig();
    int loadExtIoSetup(const char* cfgfile, ExtIOSetup* extio, size_t cnt);
    int saveExtIoSetup(const char* cfgfile, const ExtIOSetup* extio, size_t cnt);
    int loadRtuComm(Util::ConfigParser* parser, ModRtuComm& tcp, uint32_t extioIndex);
    int loadTcpComm(Util::ConfigParser* parser, NetComm& tcp, uint32_t extioIndex);
    int saveRtuComm(Util::ConfigParser* parser, ModRtuComm tcp, uint32_t extioIndex);
    int saveTcpComm(Util::ConfigParser* parser, NetComm tcp, uint32_t extioIndex);
    int iniLoadExtioReconnectParams(const char* cfgfile, int* reconnectInterval, int* reconnectMaxTimes);
    int iniSaveExtioReconnectParams(const char* cfgfile, int reconnectInterval, int reconnectMaxTimes);

private:
    void _handleRtuConfigOldVersion(Util::ConfigParser* parser, int& bits, int& stopbits, int& parity);
    bool _checkBaudrate(int baudrate);
    bool _checkIPAddrIsVaild(const std::string ipAddress);
    bool _checkSlaveId(int slaveId);
};
int xmlSaveExtIOSetup(int extIOModCnt, const ExtIOSetup* extIOSetups);
#endif